package cl.duocap.refaxion.view.bean;

import java.io.Serializable;
import java.text.SimpleDateFormat;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;

import org.primefaces.event.TabChangeEvent;
import cl.duocap.refaxion.dto.AuditorioDTO;
import cl.duocap.refaxion.dto.BandejaDTO;
import cl.duocap.refaxion.dto.OrdenTrabajoDTO;
import cl.duocap.refaxion.dto.UsuarioDTO;
import cl.duocap.refaxion.servicios.AuditoriaService;
import cl.duocap.refaxion.servicios.BandejaService;
import cl.duocap.refaxion.servicios.OrdenTrabajoService;
import cl.duocap.refaxion.servicios.UsuarioService;


/**
 */
@ManagedBean(name = "mainBandejaTareasBean")
@SessionScoped
public class MainBandejaTareasBean implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private List<BandejaDTO> listaOrdenesTrabajo;
	private List<BandejaDTO> listaOrdenesTrabajoTaller;
	private List<BandejaDTO> listaOrdenesTrabajoTerminadas;
	private List<BandejaDTO> listaOrdenesTrabajoAnuladas;
	private BandejaDTO ordenesTrabajo;
	private int idOrdenDeTrabajo;
	private int responsable;
	private String fechaIngreso;
	private String fechaEntrega;
	private int precioTotal;
	private String descripcion;
	private int idPaqueteMantencion;
	private int idVehiculo;
	private int idTipoServicio;
	private int idTaller;
	private int idUsuario;
	private int estado;
	private int idOrdenlim;
	private int estadoSeleccionada;
	private String nombreBuscado; 
	private List<UsuarioDTO> listaEmpleadosObtenidos;
	private int ordenTrabajoPorAsignar;
	private int ordenTrabajoPorAnular;
	private int ordenTrabajoPorGestionar;
	private boolean desabilitadoAccion = false;
	private boolean desabilitadoAccionPrecios = false;
	private OrdenTrabajoDTO ordenTrabajoParaVenta;
	private OrdenTrabajoDTO ordenTrabajoEstado;
	private int descuento;
	private int precioTotalFinal;
	private AuditorioDTO accion = new AuditorioDTO();
	@ManagedProperty("#{logeadoBean}")
    private LogeadoBean logeadoBean; 
	private boolean desabilitadoPorPerfil = false;

	@PostConstruct
	public void iniciar() {
		ordenesTrabajo = new BandejaDTO();
		if (FacesContext.getCurrentInstance().isPostback()) {
			return;
		}
		desabilitadoPorPerfil = false;
		UsuarioService empleados = new UsuarioService();
		//setListaEmpleadosObtenidos(empleados.obtenerTodosEmpleados());
		if(logeadoBean.getUsuarioValidado().getIdTipoUsuario() == 1){
			setDesabilitadoPorPerfil(true);
		}
		
		inicializar();
	}
	
	public void inicializar(){
		
	//	listarOTPendientes();
		//listarOTEnTaller();
//		listarOTTerminadas();
//		listarOTAnuladas();
		
	}

	public void onTabChange(TabChangeEvent event) {
		
		//String idt = event.getTab().getId();
		

		if (event.getTab().getTitle().endsWith("OT Pendientes")) {
			setEstadoSeleccionada(0);
		}
		if (event.getTab().getTitle().endsWith("OT En Taller")) {
			setEstadoSeleccionada(1);
		}
		if (event.getTab().getTitle().endsWith("OT Terminadas")) {
			setEstadoSeleccionada(2);
		}
		if (event.getTab().getTitle().endsWith("OT Anuladas")) {
			setEstadoSeleccionada(3);
		}

		BandejaService orden = new BandejaService();

		listaOrdenesTrabajo = orden.obtenerEnTaller(getEstadoSeleccionada());

	}

	public MainBandejaTareasBean() {
	}

	public void listarOTPendientes() {

		try {

			BandejaService orden = new BandejaService();
			listaOrdenesTrabajo = orden.obtenerPendiente(0);
			// return "bandejaUsuario.xhtml?faces-redirect=true";

		} catch (Exception e) {
			FacesContext.getCurrentInstance().addMessage(
					null,
					new FacesMessage(FacesMessage.SEVERITY_ERROR, e
							.getMessage(), e.getMessage()));
			System.out.println("error Lista Pendientes");
			// return null;
		}

	}

	public void listarOTEnTaller() {

		try {

			BandejaService ordenTaller = new BandejaService();
			listaOrdenesTrabajoTaller = ordenTaller.obtenerPendiente(1);
			// return "bandejaUsuario.xhtml?faces-redirect=true";

		} catch (Exception e) {
			FacesContext.getCurrentInstance().addMessage(null,new FacesMessage(FacesMessage.SEVERITY_ERROR, e
							.getMessage(), e.getMessage()));
			System.out.println("error Lista En Taller");
			// return null;
		}

	}

	public void listarOTTerminadas() {

		try {

			BandejaService orden = new BandejaService();
			listaOrdenesTrabajoTerminadas = orden.obtenerPendiente(2);
			// return "bandejaUsuario.xhtml?faces-redirect=true";

		} catch (Exception e) {
			FacesContext.getCurrentInstance().addMessage(null,new FacesMessage(FacesMessage.SEVERITY_ERROR, e
							.getMessage(), e.getMessage()));
			System.out.println("error Lista Terminadas");
			// return null;
		}

	}
	
	public void listarOTAnuladas() {

		try {

			BandejaService orden = new BandejaService();
			listaOrdenesTrabajoAnuladas = orden.obtenerPendiente(3);
			// return "bandejaUsuario.xhtml?faces-redirect=true";

		} catch (Exception e) {
			FacesContext.getCurrentInstance().addMessage(null,new FacesMessage(FacesMessage.SEVERITY_ERROR, e
							.getMessage(), e.getMessage()));
			System.out.println("error Lista Terminadas");
			// return null;
		}

	}
	
	public String listenerEditarUsuario(String idUsuarioEditar){

		String url = "/mantenedor/usuario/formUsuarioEditar?faces-redirect=true&idUsuario=" + idUsuarioEditar;			
		return url;
	}
	
	public void listenerAsignarResponsable(int idOrdenTrabajo){
		setOrdenTrabajoPorAsignar(idOrdenTrabajo);
	}
	
	public String asignarEmpleadoSeleccionadoOT(int idUsuario){
		
		try {
			OrdenTrabajoService orden = new  OrdenTrabajoService();
			if(orden.asignarResponsableOT(getOrdenTrabajoPorAsignar(), idUsuario)){
				inicializar();
				return "/genericas/bandejaUsuario.xhtml?faces-redirect=true";
			}else{
				return "/genericas/bandejaUsuario.xhtml?faces-redirect=true";
			}
		} catch (Exception e) {
			throw new RuntimeException("Error asignar empleado a OT.",e);
		}

	}
	
	public void listenerAnularOT(int idOrden){
		setOrdenTrabajoPorAnular(idOrden);
	}
	
	public String confirmarAnularOrdenTrabajo(){

		try {

			OrdenTrabajoService orden = new OrdenTrabajoService();
			if(orden.anularOrdenTrabajo(getOrdenTrabajoPorAnular())){
				inicializar();
				return "/genericas/bandejaUsuario.xhtml?faces-redirect=true";
			}else{
				return "/genericas/bandejaUsuario.xhtml?faces-redirect=true";
			}
			
		} catch (Exception e) {
			FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), e.getMessage()));
			System.out.println("errorLista anular OT");
			return "error";
		}	
			
	}
	
	public void listenerGestionarOT(int idOrdenTrabajo){
		
		try {
			setOrdenTrabajoPorGestionar(idOrdenTrabajo);
			OrdenTrabajoService ordenGestionar = new OrdenTrabajoService();
			setOrdenTrabajoEstado(ordenGestionar.buscarOrdenTrabajo(idOrdenTrabajo));
			accion.setEstadoActual(ordenTrabajoEstado.getEstado());
			
		} catch (Exception e) {
			throw new RuntimeException("listenerGestionarOT.",e);
		}
		
		
	}
	
	public void listenerGenerarBoleta(int idOrdenTrabajo){
		setOrdenTrabajoPorGestionar(idOrdenTrabajo);
		OrdenTrabajoService ordenVenta = new OrdenTrabajoService();
		setOrdenTrabajoParaVenta(ordenVenta.buscarOrdenTrabajo(idOrdenTrabajo));
	}
	
	public String registrarEstadoOT(){
		
		try {
			
			accion.setEstadoNuevo(accion.getEstadoActual());
			accion.setEstadoActual(ordenTrabajoEstado.getEstado());
			accion.setItem("OrdenTrabajo");
			accion.setIdUsuario(logeadoBean.getUsuarioValidado().getIdUsuario()); //como recupera el id del usuario conectado
			OrdenTrabajoService ordenActualizaEstado = new OrdenTrabajoService();
			if(ordenActualizaEstado.actualizarEstadoOrdenTrabajo(ordenTrabajoEstado.getIdOrdenDeTrabajo(),accion.getEstadoNuevo())){
				
				SimpleDateFormat dateformatJava = new SimpleDateFormat("dd-MM-yyyy");
				accion.setFechaAccion(dateformatJava.format(accion.getFechaAccionTrans()));
				AuditoriaService auditoria = new AuditoriaService();
				auditoria.registrarAccion(accion);
				
				inicializar();
				return "/genericas/bandejaUsuario.xhtml?faces-redirect=true";
			}else{
				return "/genericas/bandejaUsuario.xhtml?faces-redirect=true";
			}
			
		} catch (Exception e) {
			throw new RuntimeException("registrarEstadoOT.",e);
		}
		
		
	}

	public void obtenerEmpleadosPorFiltros(){
		
	}
	
	public void buscarListener(){
		
	}
	
	public void limpiarBusquedaEmpleado(){
		
	}
	
	public void seleccionarEmpleadoBusqueda(){
		
	}
	
	public String listenerVerOT(int idOrdenTrabajo){
		String url = "/genericas/ordenDeTrabajo/formOrdenDeTrabajoVer.xhtml?faces-redirect=true&idOrdenTrabajo=" + idOrdenTrabajo;			
		return url;
	}
	
	public List<BandejaDTO> getListaOrdenesTrabajoAnuladas() {
		return listaOrdenesTrabajoAnuladas;
	}

	public void setListaOrdenesTrabajoAnuladas(
			List<BandejaDTO> listaOrdenesTrabajoAnuladas) {
		this.listaOrdenesTrabajoAnuladas = listaOrdenesTrabajoAnuladas;
	}

	public List<BandejaDTO> getListaOrdenesTrabajoTaller() {
		return listaOrdenesTrabajoTaller;
	}

	public List<BandejaDTO> getListaOrdenesTrabajoTerminadas() {
		return listaOrdenesTrabajoTerminadas;
	}

	public void setListaOrdenesTrabajoTerminadas(
			List<BandejaDTO> listaOrdenesTrabajoTerminadas) {
		this.listaOrdenesTrabajoTerminadas = listaOrdenesTrabajoTerminadas;
	}

	public void setListaOrdenesTrabajoTaller(List<BandejaDTO> listaOrdenesTrabajoTaller) {
		this.listaOrdenesTrabajoTaller = listaOrdenesTrabajoTaller;
	}

	public List<BandejaDTO> getListaOrdenesTrabajo() {
		return listaOrdenesTrabajo;
	}

	public void setListaOrdenesTrabajo(List<BandejaDTO> listaOrdenesTrabajo) {
		this.listaOrdenesTrabajo = listaOrdenesTrabajo;
	}

	public BandejaDTO getOrdenesTrabajo() {
		return ordenesTrabajo;
	}

	public void setOrdenesTrabajo(BandejaDTO ordenesTrabajo) {
		this.ordenesTrabajo = ordenesTrabajo;
	}

	public int getIdOrdenDeTrabajo() {
		return idOrdenDeTrabajo;
	}

	public void setIdOrdenDeTrabajo(int idOrdenDeTrabajo) {
		this.idOrdenDeTrabajo = idOrdenDeTrabajo;
	}

	public int getResponsable() {
		return responsable;
	}

	public void setResponsable(int responsable) {
		this.responsable = responsable;
	}

	public String getFechaIngreso() {
		return fechaIngreso;
	}

	public void setFechaIngreso(String fechaIngreso) {
		this.fechaIngreso = fechaIngreso;
	}

	public String getFechaEntrega() {
		return fechaEntrega;
	}

	public void setFechaEntrega(String fechaEntrega) {
		this.fechaEntrega = fechaEntrega;
	}

	public int getPrecioTotal() {
		return precioTotal;
	}

	public void setPrecioTotal(int precioTotal) {
		this.precioTotal = precioTotal;
	}

	public String getDescripcion() {
		return descripcion;
	}

	public void setDescripcion(String descripcion) {
		this.descripcion = descripcion;
	}

	public int getIdPaqueteMantencion() {
		return idPaqueteMantencion;
	}

	public void setIdPaqueteMantencion(int idPaqueteMantencion) {
		this.idPaqueteMantencion = idPaqueteMantencion;
	}

	public int getIdVehiculo() {
		return idVehiculo;
	}

	public void setIdVehiculo(int idVehiculo) {
		this.idVehiculo = idVehiculo;
	}

	public int getIdTipoServicio() {
		return idTipoServicio;
	}

	public void setIdTipoServicio(int idTipoServicio) {
		this.idTipoServicio = idTipoServicio;
	}

	public int getIdTaller() {
		return idTaller;
	}

	public void setIdTaller(int idTaller) {
		this.idTaller = idTaller;
	}

	public int getIdUsuario() {
		return idUsuario;
	}

	public void setIdUsuario(int idUsuario) {
		this.idUsuario = idUsuario;
	}

	public int getEstado() {
		return estado;
	}

	public void setEstado(int estado) {
		this.estado = estado;
	}

	public int getIdOrdenlim() {
		return idOrdenlim;
	}

	public void setIdOrdenlim(int idOrdenlim) {
		this.idOrdenlim = idOrdenlim;
	}

	public int getEstadoSeleccionada() {
		return estadoSeleccionada;
	}

	public void setEstadoSeleccionada(int estadoSeleccionada) {
		this.estadoSeleccionada = estadoSeleccionada;
	}

	public String getNombreBuscado() {
		return nombreBuscado;
	}

	public void setNombreBuscado(String nombreBuscado) {
		this.nombreBuscado = nombreBuscado;
	}

	public List<UsuarioDTO> getListaEmpleadosObtenidos() {
		return listaEmpleadosObtenidos;
	}

	public void setListaEmpleadosObtenidos(List<UsuarioDTO> listaEmpleadosObtenidos) {
		this.listaEmpleadosObtenidos = listaEmpleadosObtenidos;
	}

	public int getOrdenTrabajoPorAsignar() {
		return ordenTrabajoPorAsignar;
	}

	public void setOrdenTrabajoPorAsignar(int ordenTrabajoPorAsignar) {
		this.ordenTrabajoPorAsignar = ordenTrabajoPorAsignar;
	}

	public int getOrdenTrabajoPorAnular() {
		return ordenTrabajoPorAnular;
	}

	public void setOrdenTrabajoPorAnular(int ordenTrabajoPorAnular) {
		this.ordenTrabajoPorAnular = ordenTrabajoPorAnular;
	}

	public int getOrdenTrabajoPorGestionar() {
		return ordenTrabajoPorGestionar;
	}

	public void setOrdenTrabajoPorGestionar(int ordenTrabajoPorGestionar) {
		this.ordenTrabajoPorGestionar = ordenTrabajoPorGestionar;
	}

	public boolean isDesabilitadoAccion() {
		return desabilitadoAccion;
	}

	public void setDesabilitadoAccion(boolean desabilitadoAccion) {
		this.desabilitadoAccion = desabilitadoAccion;
	}

	public OrdenTrabajoDTO getOrdenTrabajoParaVenta() {
		return ordenTrabajoParaVenta;
	}

	public void setOrdenTrabajoParaVenta(OrdenTrabajoDTO ordenTrabajoParaVenta) {
		this.ordenTrabajoParaVenta = ordenTrabajoParaVenta;
	}

	public int getDescuento() {
		return descuento;
	}

	public void setDescuento(int descuento) {
		this.descuento = descuento;
	}

	public int getPrecioTotalFinal() {
		return precioTotalFinal;
	}

	public void setPrecioTotalFinal(int precioTotalFinal) {
		this.precioTotalFinal = precioTotalFinal;
	}

	public boolean isDesabilitadoAccionPrecios() {
		return desabilitadoAccionPrecios;
	}

	public void setDesabilitadoAccionPrecios(boolean desabilitadoAccionPrecios) {
		this.desabilitadoAccionPrecios = desabilitadoAccionPrecios;
	}

	public OrdenTrabajoDTO getOrdenTrabajoEstado() {
		return ordenTrabajoEstado;
	}

	public void setOrdenTrabajoEstado(OrdenTrabajoDTO ordenTrabajoEstado) {
		this.ordenTrabajoEstado = ordenTrabajoEstado;
	}

	public AuditorioDTO getAccion() {
		return accion;
	}

	public void setAccion(AuditorioDTO accion) {
		this.accion = accion;
	}

	public LogeadoBean getLogeadoBean() {
		return logeadoBean;
	}

	public void setLogeadoBean(LogeadoBean logeadoBean) {
		this.logeadoBean = logeadoBean;
	}

	public boolean isDesabilitadoPorPerfil() {
		return desabilitadoPorPerfil;
	}

	public void setDesabilitadoPorPerfil(boolean desabilitadoPorPerfil) {
		this.desabilitadoPorPerfil = desabilitadoPorPerfil;
	}

}
